/*
 *  Copyright (C) 2010 Glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.bindings;

import org.balisunrise.common.BindingException;

/**
 * Interface de suporte para o binding.<br>
 * Esta interface disponibiliza métodos para leitura e escrita das propriedades
 * de um objeto, source ou target, do binding.
 * 
 * @author Glauco
 */
public interface BindingSupport<T> {

    /**
     * Le o valor da propriedade do source.
     *
     * @return o valor da propriedade.
     *
     * @throws BindingException Caso ocorra algum problema com o BindingSupport
     * durante a leitura. Quando esse erro ocorrer há chances de não ser
     * possível realizar o bind.
     *
     * @throws NullPointerException Caso o source seja nulo. Neste caso o valor
     * do Target deverá nulo também.
     */
    public T getPropertyValue()
            throws BindingException, NullPointerException;

    /**
     * Atribui o valor a propriedade do source.
     *
     * @param value valor a ser atribuído.
     *
     * @throws BindingException Caso ocorra algum problema com BindingSupport
     * durante a atribuíção. Quando esse erro ocorrer há chances de não ser
     * possível realizar o bind.
     *
     * @throws NullPointerException Caso o souce seja nulo. Neste caso o valor
     * do Target deverá nulo também.
     *
     * @throws Exception Tratamento de exceções para os métodos
     * <code>set</code>. Quando um método <code>set</code> o Binding deve
     * ativar o evento de invalidação dos dados. Lançar uma Exception
     * durante o método <code>set</code> tem a mesma funcionalidade que o
     * Validator.
     */
    public void setPropertyValue(T value)
            throws BindingException, NullPointerException, Exception;
}
